package mx.unam.ia.algoritmos;

/**
 *
 * @author Juan Fco. Navarrete
 */

import java.util.HashMap;
import java.util.Map;

//Define las operaciones unarias posibles: seno(X) y valor absolluto.
public enum OperacionUnaria
{    
    SENO("s")
    {
        public double ejecutar(double a)
        {
            return Math.sin(a);
        }
    },
    ABS("a")
    {
        public double ejecutar(double a)
        {
            return Math.abs(a);
        }
    };

   //Asigna a cada simbolo de la operacion un valor respectivo.
    private String simbolo;
    private static final Map<String,OperacionUnaria> map = new HashMap<String,OperacionUnaria>();

    static
    {
        for (OperacionUnaria operacion : OperacionUnaria.values())
        {
            map.put(operacion.getSimbolo(), operacion);
        }
    }

    private OperacionUnaria(String simbolo) //Se obteien la operacion unaria dependiendo del simbolo
    {
        this.simbolo = simbolo;
    }

    public String getSimbolo() //Define cual es el simbolo
    {
        return simbolo;
    }

    public abstract double ejecutar(double a);

    public static double aplicar(String simbolo, double a) //se aplica la operacion siempre y cuando se encuentre un valor dado para el simbolo
    {
        OperacionUnaria operacion = map.get(simbolo);
        if(operacion != null)
        {
            return operacion.ejecutar(a);
        }
        throw new UnsupportedOperationException("Operacion no valida para el simbolo " + simbolo);
    }

    public static boolean esUnaria(String simbolo) //Indica si la operacion es unaria.
    {
        return map.containsKey(simbolo);
    }

    public static String obtenerOperacion() // Se obtiene el valor de la operacion unaria.
    {
        OperacionUnaria[] operaciones = OperacionUnaria.values();
        int aleatorio = (int)(Math.random() * operaciones.length);
        return operaciones[aleatorio].getSimbolo();
    }
}